package com.cskaoyan.javase.oop1._10static._0introduction;

/**
 * static的引入
 * 引例：
 * 首先定义一个球员类（Player）用来描述一名篮球运动员，要求：
 *      属性：姓名、性别、年龄、个人总得分、工资
 *
 * 然后再定义一个球队类（Team）用来描述一个篮球队，要求：
 * 属性：组成球队的球员、工资帽、球队总得分
 *
 * 像工资帽这种明显不属于对象,但被全体对象共享,是属于类的信息
 * 描述类的特征
 * 不要使用成员变量去定义它,而是使用静态成员变量
 *
 *
 * @since 15:02
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Player[] players = new Player[3];
        Player p1 = new Player("张三", "男", 18, 1, 1000);
        Player p2 = new Player("李四", "男", 28, 3, 3000);
        Player p3 = new Player("小黑子", "男", 17, 2, 2000);
        players[0] = p1;
        players[1] = p2;
        players[2] = p3;
        Team fuJianTeam = new Team("福建队", 10000, players);
        System.out.println(fuJianTeam.judge());
    }
}

// 篮球运动员类
class Player {
    String name;
    /*
        关于性别,不同的公司会采取不同的定义方式,以公司为准
        给出一个普遍的建议,建议定义String类型的性别:
            String gender;
        不建议用布尔类型来表示性别,比如:
            boolean isMale;
            boolean isFemale;
        主要是会引起一些框架使用上的问题(后面再讲)
     */
    String gender;
    int age;
    int score;
    double salary;

    public Player(String name, String gender, int age, int score, double salary) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.score = score;
        this.salary = salary;
    }
}

// 篮球队类
class Team {
    String name;
    /*
        工资帽这种不属于对象的
        而是应该属于类的,描述类的特征,属于全体对象共享的
        应该定义成一个静态成员变量
        属于类的变量在Java当中是存在的，即使用static关键字修饰的，Java当中的静态成员变量。
     */
    double salaryCap;
    // 用球员对象的数组来表示全体球员
    Player[] players;

    int totalScore;

    public Team(String name, double salaryCap, Player[] players) {
        this.players = players;
        this.name = name;
        this.salaryCap = salaryCap;
        init();
    }

    // 该方法用于初始化球队的总分
    public void init() {
        for (Player player : players) {
            totalScore += player.score;
        }
    }

    // 给出一个方法,用于判断是否能够创建该球队
    // true表示可以创建,false表示不能创建
    public boolean judge() {
        double totalSalary = 0;
        for (Player player : players) {
            totalSalary += player.salary;
        }
        return totalSalary < salaryCap;
    }
}